/*************************************************************************
    > File Name: 2fork-3.c
    > Author: Ykk
    > Mail: 3393579535@qq.com 
    > Created Time: 2023年04月11日 星期二 19时56分23秒
 ************************************************************************/

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/wait.h>

//等待子进程退出
int main()
{
	int i = 0;
	int ret = -1;
	int status = 0;
	pid_t pid = -1;
	pid = fork();

	if(pid<0)
	{
		//没有创建成功
		perror("fork");
		return 1;
	}
	if(0==pid)
	{
		for(i=0;i<15;i++)
		{
			printf("child process %d do thing %d\n",getpid(),i+1);
			sleep(1);
		}
		//子进程终止
		exit(10);
	}

	//父进程执行
	printf("父进程等待子进程退出，回收其资源\n");
	//父进程阻塞 等待子进程退出
	//ret = wait(&status);

	//等价于wait
	//ret = waitpid(-1,&status,0);
	
	//第三个参数表示不阻塞
	//ret = waitpid(-1,&status,WNOHANG);
	if(-1 == ret)
	{
		perror("wait");
		return 1;
	}

	printf("父进程回收了子进程资源...\n");

	//属于正常退出
	if(WIFEXITED(status))
	{
		printf("子进程退出状态码:%d\n",WEXITSTATUS(status)); 
	}
	else if(WIFSIGNALED(status))
	{
		printf("子进程被信号%d杀死了...\n",WTERMSIG(status));
	}
	else if(WIFSTOPPED(status))
	{
		printf("子进程被信号%d暂停了...\n",WSTOPSIG(status));
	}
	return 0;
}
